package com.xu.cloud.common.trans;

// import com.xu.cloud.common.api.XuApi;
// import com.xu.cloud.common.constant.LogConstant;
// import com.xu.cloud.common.exception.ErrorCodeEnum;
// import com.xu.cloud.common.exception.XuCloudException;
// import com.xu.cloud.common.trans.TransContext;
// import com.xu.cloud.common.pojo.Result;
// import com.xu.cloud.common.pojo.http.req.BaseRequest;
// import com.xu.cloud.common.pojo.http.resp.BaseResponse;
// import com.xu.cloud.common.util.HttpServletUtil;
// import com.xu.cloud.common.util.ResourceUtil;
// import org.aspectj.lang.ProceedingJoinPoint;
// import org.aspectj.lang.annotation.Around;
// import org.aspectj.lang.annotation.Aspect;
// import org.aspectj.lang.annotation.Pointcut;
// import org.aspectj.lang.reflect.MethodSignature;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.slf4j.MDC;
// import org.springframework.core.annotation.AnnotationUtils;
// import org.springframework.core.annotation.Order;
// import org.springframework.util.StringUtils;
//
// import java.util.Objects;
//
// /**
//  * 将BaseRequest和BaseResponse传入TransContext
//  *
//  * @author xuguan
//  * @since 2024/1/9
//  */
// @Order(0)
// @Aspect
// public class TransContextAspect {
//
//     public static final Logger log = LoggerFactory.getLogger(TransContextAspect.class);
//
//     // @Pointcut("execution(* com.xu..*Controller.*(..))")
//     // public void pointcut() {
//     //
//     // }
//
//     @Pointcut("execution(* com.xu..*.*(..))" +
//             "&&(@annotation(org.springframework.web.bind.annotation.RequestMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.GetMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.PostMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.PutMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.DeleteMapping))")
//     public void pointcut() {
//
//     }
//
//     @Around("pointcut()")
//     public Object around(ProceedingJoinPoint pjp) throws Throwable {
//         skipStatic(pjp);
//
//         final TransContext transContext = TransContext.current();
//
//         final MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
//         final XuApi apiInfo = AnnotationUtils.getAnnotation(methodSignature.getMethod(), XuApi.class);
//         if (Objects.nonNull(apiInfo) && StringUtils.hasText(apiInfo.apiCode())) {
//             final String apiCode = apiInfo.apiCode();
//             transContext.setApiCode(apiCode);
//             MDC.put(LogConstant.API_CODE, apiCode);
//         }
//
//         // 请求参数
//         final Object[] args = pjp.getArgs();
//         for (final Object arg : args) {
//             if (Objects.isNull(arg)) {
//                 continue;
//             }
//
//             if (BaseRequest.class.isAssignableFrom(arg.getClass())) {
//                 BaseRequest baseRequest = (BaseRequest) arg;
//
//                 final String reqJournalNo = StringUtils.hasText(baseRequest.getReqJournalNo())
//                         ? baseRequest.getReqJournalNo()
//                         : transContext.getReqJournalNo();
//
//                 transContext.setBaseRequest(baseRequest);
//                 transContext.setReqJournalNo(reqJournalNo);
//
//                 baseRequest.setReqTime(transContext.getReqTime());
//                 baseRequest.setReqJournalNo(transContext.getReqJournalNo());
//             }
//         }
//
//         MDC.put(LogConstant.REQUEST_JOURNAL_NO, transContext.getReqJournalNo());
//
//         // 请求执行
//         Object returnObj = null;
//         try {
//             returnObj = pjp.proceed();
//
//             transContext.setCode(ErrorCodeEnum.OK.getCode());
//             transContext.setMsg(ErrorCodeEnum.OK.getMessage());
//         } catch (XuCloudException xuCloudException) {
//             final String code = xuCloudException.getCode();
//             final String message = xuCloudException.getMessage();
//             transContext.setThrowable(xuCloudException);
//             transContext.setCode(code);
//             transContext.setMsg(message);
//
//             throw xuCloudException;
//         } catch (Throwable throwable) {
//             transContext.setThrowable(throwable);
//             transContext.setCode(ErrorCodeEnum.INTERNAL_SERVER_ERROR.getCode());
//             transContext.setMsg(ErrorCodeEnum.INTERNAL_SERVER_ERROR.getMessage());
//
//             throw throwable;
//         } finally {
//             // 后置处理
//             Object data = null;
//             BaseResponse baseResponse = null;
//
//             if (Objects.nonNull(returnObj)) {
//                 if (Result.class.isAssignableFrom(returnObj.getClass())) {
//                     Result<?> result = (Result<?>) returnObj;
//                     data = result.getData();
//
//                     if (Objects.nonNull(data) && BaseResponse.class.isAssignableFrom(data.getClass())) {
//                         baseResponse = (BaseResponse) data;
//                     }
//                 }
//
//                 if (BaseResponse.class.isAssignableFrom(returnObj.getClass())) {
//                     baseResponse = (BaseResponse) returnObj;
//                 }
//             }
//
//             transContext.setBaseResponse(baseResponse);
//         }
//
//         return returnObj;
//     }
//
//     private void skipStatic(ProceedingJoinPoint pjp) throws Throwable {
//         final String requestUri = HttpServletUtil.currentRequest().getRequestURI();
//         if (ResourceUtil.isStatic(requestUri)) {
//             pjp.proceed();
//         }
//     }
// }
